#ifndef INC_LEXER_H
#define INC_LEXER_H
/**
@file Lexer
@author F. Aubert
*/

#include <fstream>

namespace fileIO {

const int CASE_SENSITIVE=0x0001;
const int EOL_TOKEN=0x0010;

typedef enum {CARDINAL,DOUBLE,INCONNU,CHAINE,P_EOL,FIN,LINE_COMMENT,INTEGER} Token;

class Lexer {
  std::fstream f;
  bool endline;         // si fin de ligne = token
  bool sensitive;       // si sensible à la casse
  Token le_token;       // token courant
  bool isExist;
  // valeurs token courant :
  std::string la_chaine;
  std::string le_comment;
  float le_float;
  int le_int;
  double le_reel;
  unsigned int le_cardinal;
  char le_car;


  // euh, je ne sais plus
  bool the_end;

  // nombre lignes lues (debug)
  int nb_ligne;

  bool skipCar();
  bool estSeparateur();

  std::string commentLineId;
  std::string separator;
  std::string _filename;

public:
  Lexer(std::string nom,int mode=0);
  ~Lexer();


  void check();
  bool isEnd();
  bool isEol();
  bool isOk();
  bool isOpen();

  void setCommentLine(std::string s);
  void setSeparator(std::string s);


  bool skipInteger();
  bool skipNumber();
  void skipToken();
  void skipEol();
  void skipMot();
  void skipMotSameLine();

  bool isFileOpen();
  bool isLineComment();
  bool isSeparator();

  bool isDigit();
  Token &token() {
    return le_token;
  }

  std::string chaine() {
    return la_chaine;
  }
  int entier() {
    return le_int;
  }
  double reel() {
    return le_reel;
  }
  unsigned int cardinal() {
    return le_cardinal;
  }

  std::string comment() {
    return le_comment;
  }

  void lireLigne();
  void passerEspaceLigne();
  void passerEspace();
  void passerAcco();

  bool readString(const std::string &s);

  std::string filename();

  void close();


  inline int nbLigne() {
    return nb_ligne;
  }
};


}


#endif
